package com.example.factory.net;

import android.text.format.DateFormat;
import android.util.Log;

import com.alibaba.sdk.android.oss.OSS;
import com.alibaba.sdk.android.oss.OSSClient;
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import com.example.factory.Factory;

import java.io.File;
import java.util.Date;

import utils.HashUtil;

/**
 * @author:0.2℃
 * @date： 2021-12-26 18:28
 * @version:
 * @Description ：上传工具类，用于上传任意文件到阿里云OSS存储
 */
public class UploadHelper {
    private static final String TAG = "UploadHelper";
    //
    private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
    // 上传的仓库名
    private static final String BUCKET_NAME = "imalachat";

    private static OSS getClient() {
        // 明文设置secret的方式建议只在测试时使用，更多鉴权模式请参考后面的`访问控制`章节
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(
                "LTAI5tMhEeRvgdKtHMMywB8z", "rxEa53iRYAdy1kfHqnFTLXATmD1GTi");
        return new OSSClient(Factory.app(), ENDPOINT, credentialProvider);
    }

    /**
     * 上传的最终方法，成功返回一个路径
     * @param objKey 上传上去之后，在服务器的独立key
     * @param path 需要上传的文件的路劲
     * @return 存储的地址
     */
    private static String upload(String objKey, String path) {
        // 构造上传请求。
        // 依次填写Bucket名称（例如examplebucket）和Object完整路径（例如exampledir/exampleobject.txt）。
        // Object完整路径中不能包含Bucket名称。
        PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, objKey, path);

        try {
            // 初始化上传的client
            OSS client = getClient();
            // 开始同步上传
            PutObjectResult result = client.putObject(request);
            // 得到一个外网可访问的地址
            String url = client.presignPublicObjectURL(BUCKET_NAME, objKey);
            Log.d(TAG, String.format("PutObjectResultURL:%s", url));
            return url;

        } catch (Exception e) {
            e.printStackTrace();
            // 如果有异常则返回空
            return null;
        }
    }

    /**
     * 上传普通图片
     * @param path 本地地址
     * @return 服务器地址
     */
    public static String uploadImage(String path) {
        String key = getImageObjKey(path);
        return upload(key, path);
    }

    /**
     * 上传头像图片
     * @param path 本地地址
     * @return 服务器地址
     */
    public static String uploadPortrait (String path) {
        String key = getPortraitObjKey(path);
        return upload(key, path);
    }

    /**
     * 上传音频
     * @param path 本地地址
     * @return 服务器地址
     */
    public static String uploadAudio(String path) {
        String key = getAudioObjKey(path);
        return upload(key, path);
    }

    /**
     * 分月存储，避免一个文件夹太多
     * 使用的DateFormat是在android.text.format这个包下的
     * @return
     */
    private static String getDateString() {
        return DateFormat.format("yyyyMM", new Date()).toString();
    }

    /**
     * 文件路径例子：//image/202112/sdgergvs.jpg
     * @param path
     * @return
     */
    private static String getImageObjKey(String path) {
        String fileMd5 = HashUtil.getMD5String(new File(path));
        String dateString = getDateString();

        return String.format("image/%s/%s.jpg", dateString, fileMd5);
    }

    private static String getPortraitObjKey(String path) {
        String fileMd5 = HashUtil.getMD5String(path);
        String dateString = getDateString();

        return String.format("portrait/%s/%s.jpg", dateString, fileMd5);
    }

    private static String getAudioObjKey(String path) {
        String fileMd5 = HashUtil.getMD5String(path);
        String dateString = getDateString();

        return String.format("audio/%s/%s.mp3", dateString, fileMd5);

    }
}


